package com.ssdp.controller;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.ssdp.constant.UploadConstant;
import com.ssdp.dto.Result;
import com.ssdp.utils.UploadUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

/**
 * @author syo 2319615164@qq.com
 * @description 图片上传和下载接口
 * @date 2024/3/14
 * @Copyright syo
 */
@Slf4j
@RestController
@RequestMapping("upload")
@Api(tags = "图片上传和下载相关接口")
public class UploadController {

    @ApiOperation("上传图片到远程服务器并保存到本地服务器")
    @PostMapping("blog")
    public Result uploadImage(@RequestParam("file") MultipartFile image) {
        try {
            // 1. 获取原始文件名称
            String originalFilename = image.getOriginalFilename();

            // 2. 生成新文件名
            String fileName = createNewFileName(originalFilename);

            // 3. 获取该文件的输入流
            InputStream inputStream = image.getInputStream();

            // 4. 上传到远程服务器
            // UploadUtils.uploadFile(fileName, inputStream);

            // 5. 保存文件到本地Nginx服务器
            image.transferTo(new File(UploadConstant.NGINX_IMAGE_UPLOAD_DIR, fileName));

            // 6. 返回结果
            log.debug("文件上传成功，{}", fileName);
            return Result.ok(fileName);

        } catch (IOException e) {
            throw new RuntimeException("文件上传失败", e);
        }
    }

    @ApiOperation("删除博客图片")
    @GetMapping("/blog/delete")
    public Result deleteBlogImg(@RequestParam("name") String filename) {
        File file = new File(UploadConstant.NGINX_IMAGE_UPLOAD_DIR, filename);
        if (file.isDirectory()) {
            return Result.fail("错误的文件名称");
        }
        FileUtil.del(file);
        return Result.ok();
    }

    /**
     * 生成文件名并创建目录
     * @param originalFilename 原始文件名
     * @return 新的文件名
     */
    private String createNewFileName(String originalFilename) {
        // 1. 获取后缀
        String suffix = StrUtil.subAfter(originalFilename, ".", true);
        // 2. 生成目录
        String name = UUID.randomUUID().toString();
        int hash = name.hashCode();

        // 3. 生成一级目录
        int d1 = hash & 0xF;

        // 4. 生成二级目录
        int d2 = (hash >> 4) & 0xF;

        // 5. 判断目录是否存在
        File dir = new File(UploadConstant.NGINX_IMAGE_UPLOAD_DIR, StrUtil.format("/blogs/{}/{}", d1, d2));
        if (!dir.exists()) {
            boolean ok = dir.mkdirs();
            if (!ok) {
                throw new RuntimeException("文件目录创建错误！");
            }
        }

        // 6. 生成文件名
        return StrUtil.format("/blogs/{}/{}/{}.{}", d1, d2, name, suffix);
    }
}
